﻿#ifndef MYTABLEDATA_H
#define MYTABLEDATA_H

#include "DBConfig_Include.h"
#include "db_cfg_g_def.h"
#include "DBText.h"
#include "MenuInfo.h"
#include "DbCfgFun.h"
#include "mytreewidget.h"
#include <QList>
#include <QDateTime>


#pragma pack(1)
class MyTreeWidget;

typedef struct _FieldData
{
	int	FieldIndex;					//显示域序号
	int	ColumnNo;					//域序号
	int	ColumnId;					//域ID
	int	clmDataType;				//域的数据类型
	char	*pDataBuff;					//域数据缓冲区
	int	Buff_Len;					//缓冲区长度
	_FieldData()
	{
		FieldIndex = 0;
		ColumnNo = 0;
		ColumnId = 0;
		clmDataType = 0;
		pDataBuff = NULL;
		Buff_Len = 0;
	}
	~_FieldData()
	{
		if (pDataBuff)
		{
			delete [](char*)pDataBuff;
			pDataBuff = NULL;
		}
	}
}FieldData;									//域数据

typedef struct _RecordInfo
{
	bool			 bNewFlag;				//是否是新记录
	int			 nRowAttrib;			//记录属性
	int			 nRecordIndex;			//数据序号，从0开始
//	int			 nDispRowIndex;			//从0开始
	char			 *RecordBuff;			//记录内容指针
	int			 BuffLength;			//记录内容长度
	QList<FieldData> UpDateFieldlist;		//修改域
	_RecordInfo()
	{
		bNewFlag = false;
		nRowAttrib = 0;
		nRecordIndex = 0;
		//nDispRowIndex =0;
		RecordBuff = NULL;
		BuffLength = 0;
		UpDateFieldlist.clear();
	}
	~_RecordInfo()
	{
		if (RecordBuff)
		{
			delete []RecordBuff;
			RecordBuff = NULL;
		}
		UpDateFieldlist.clear();
	}

}RecordInfo;						//记录数据

typedef	struct _FieldInfo_Show		//显示域信息
{
	int	FieldNo;				//显示域序号
	int	ColumnNo;				//域名序号
	int	ColumnId;				//域名ID
	int	DataOffset;				//数据偏移
	_FieldInfo_Show()
	{
		FieldNo = 0;
		ColumnNo = 0;
		ColumnId = 0;
		DataOffset = 0;
	}
	~_FieldInfo_Show()
	{

	}
}FieldInfo_Show;						//显示域信息

typedef	struct _Col_Info				//显示域信息
{
	int	FieldNo;					//显示域序号
	int	ColumnNo;					//域名序号
	int	ColumnId;					//域名ID
	int	DataOffset;					//数据偏移
	_Col_Info()
	{
		FieldNo = 0;
		ColumnNo = 0;
		ColumnId = 0;
		DataOffset = 0;
	}
	~_Col_Info()
	{

	}
}Col_Info;								//显示域信息

#pragma pack()

class MyTableData
{
public:
    MyTableData();
	~MyTableData();

	cColumn_Info		*m_pColumnInfo;							//域信息

public:


	int		SetCurSelectRecordNo(int CurSeltRecordNo);
	int		GetCurSelectRecordNo(){return m_SeltRecordNo;};

/*	函数：	InitTableData()
	用途：	初始化表数据
	输入：  
	返回：  */
     int	GetPageNum(){return m_PageNum;};
	 void	SetPageNum();
	 int   GetCurPageNo(){return m_CurPageNo;};
	
	 int   GetCurPageRecordNum();
	   	
     int   SetCurPageNo(int CurPageNo);

	//设置下一页
	int    SetNextPage();
		//设置前一页
	int    SetPrePage();

/*	函数：	InitTableParam()
	用途：	初始化表参数
	输入：  
	返回：  */
	int		InitTableParam();

/*	函数：	InitTableData()
	用途：	初始化表数据
	输入：  
	返回：  */
	int		InitTableData(int AppType, int TableId, int ParentId, int RecordId, unsigned char PtlParamType,int FUN);

	int		ReInitTableData();

	int		InitData();
/*	函数：	GetRecordData()
	用途：	读记录数据
	输入：  
	返回：  */
	int		GetRecordData();

/*	函数：	ReleaseTableData()
	用途：	释放表数据
	输入：  
	返回：  */
	void	ReleaseTableData();

	//释放表参数
	void	ReleaseTableParam();

/*	函数：	ReleaseRecordList()
	用途：	释放链表数据
	输入：  
	返回：  */
	void	ReleaseRecordList();

/*	函数：	IsRecordParamSafe()
	用途：	判断当前表的参数是否安全
	输入：  
	返回：  */
	bool  IsRecordParamSafe();

/*	函数：	GetMenuInfoPoint()
	用途：	判断当前表的数据是否安全
	输入：  
	返回：  */
	int	GetMenuInfoPoint(MenuInfo *&pMenuInfo);

/*	函数：	GetHeadText()
	用途：	获取域标头文字
	输入：  int FieldIndex, QString &HeadText, int &ColWidth
	返回：  */
	int	GetHeadText(int FieldIndex, QString &HeadText, int &ColWidth);

/*	函数：	GetHeadIcon()
	用途：	获取域标头图标
	输入：  int FieldIndex, QString &HeadText
	返回：  */
	int	GetHeadIcon(int FieldIndex, QString &IconPath);
	
	int GetFieldData(int RecordNo, int FieldIndex, int ColumnNo, int ColumnId, char *&pDataBuff,char *&pRltDBuff, unsigned int &ShowFlag);

/*	函数：	GetFieldText()
	用途：	获取域显示文字
	输入：  int RecordNo, int FieldIndex QString &FieldText
	返回：  */
//	int	GetFieldText(int RowNo, int FieldIndex, QVariant &FieldData, QString &FieldText, bool &bColorField, bool &bChangeFlag/*, QVariant FieldDataBefore*/);	
	int GetFieldText(int RowNo, int FieldIndex, QVariant &FieldData, QString &FieldText,bool &bColorField, unsigned int &ShowFlag);

	int	GetUpDateFieldText(int RowNo, int FieldIndex, QVariant &FieldData, QString &FieldText, bool &bColorField/*, QVariant FieldDataBefore*/);

/*	函数：	GetFieldDataType()
	用途：	获取域的数据类型
	输入：  int FieldIndex
	返回：  */
	short	GetFieldDataType(int FieldIndex);

/*	函数：	GetFieldDisplayType()
	用途：	获取域显示类型
	输入：  int FieldIndex
	返回：  */
	short	GetFieldDisplayType(int FieldIndex);

/*	函数：	GetFieldIsSingleRelate()
	用途：	获取域的关联是否是单关联（与对称关联相反）
	输入：  int FieldIndex
	返回：  
	日期：  2011-04-02 */
	bool	GetFieldIsSingleRelate(int FieldIndex);

/*	函数：	GetFieldRelateAppType_TableId()
	用途：	获取域的关联信息
	输入：  int FieldIndex
	返回：  */
	int	GetFieldRelateAppType_TableId(int FieldIndex, int &AppType, int &TableId, bool &bSingleCheck);

/*	函数：	GetFieldColumnInfo()
	用途：	获取域的信息
	输入：  int FieldIndex
	返回：  */
	int	GetFieldColumnInfo(int FieldIndex, cColumn_Info &ColumnInfo);

/*	函数：	IsCurFieldEnableEdit()
	用途：	获取当前域是否可编辑
	输入：  int RecordNo, int FieldIndex
	返回：  */
	void   IsCurFieldEnableEdit(int FieldIndex, bool &bEdit, bool &bEdit_Once);

/*	函数：	IsCurFieldEnableEdit()
	用途：	获取当前域是否可编辑
	输入：  int RecordNo, int FieldIndex
	返回：  */
	bool	IsCurFieldCombox(int FieldIndex);

/*	函数：	GetCurRecordIdbyRowIndex()
	用途：	获取当前行的记录ID
	输入：  int RecordNo, int FieldIndex
	返回：  */
	int	GetCurRecordIdbyRowIndex(int RowNo, unsigned int &RecordId);
	int	GetCurRecordIdbyRowIndex(int RowNo, unsigned int &RecordId, bool &bNewRecord);
	int	GetCurRecordNoByRowNo(int RowNo);
/*	函数：	IsEnableAddNew()
	用途：	检查是否可添加新记录
	输入：  
	返回：  */
	bool	IsEnableAddNew();

/*	函数：	GetNewInsertRows()
	用途：	获取新添加的记录个数
	输入：  
	返回：  */
	int	GetNewInsertRows();

/*	函数：	AddOneRecord()
	用途：	添加一条记录
	输入：  
	返回：  */
	int	AddOneRecord(/*int RowNo*/);

/*	函数：	SetDefault_NodeInfo()
	用途：	设置记录数据的变化
	输入：  
	返回：  */
	int	UpDateDataChang(int RowNo, int FieldIndex, QVariant ItemData);

/*	函数：	SetRecordDelete()
	用途：	设置记录删除标志
	输入：  
	返回：  */
	int	SetRecordDelete(int RowNo, bool bDeleteFlag, bool &bDelImmediately);

/*	函数：	FindChangDataFromList()
	用途：	查找数据更改是否已经有存在LIST
	输入：  
	返回：  */
	int	FindChangDataFromList(int RecordNo, int FieldIndex, int columnId, int columnNo);

/*	函数：	AddChangeData()
	用途：	添加一个数据更改项
	输入：  
	返回：  */
	int	AddChangeData(char *&pDataBuff, int BuffLen, int RecordNo, int columnNo, int FieldIndex);

/*	函数：	bSaveData()
	用途：	保存更改数据内容
	输入：  
	返回：  */
	int	bSaveData();

/*	函数：	GetCurRecordNum()
	用途：	当前表记录条数
	输入：  
	返回：  */
inline int GetCurRecordNum(){return m_RecordNum;};

/*	函数：	GetCurColumnNum()
	用途：	当前表域个数
	输入：  
	返回：  */
inline int GetCurColumnNum(){return m_CurColumnNum;};

/*	函数：	GetCurShowFieldNum()
	用途：	当前表显示域个数
	输入：  
	返回：  */
inline int GetCurShowFieldNum(){return m_CurShowFieldNum;};


/*	函数：	GetFieldColumnId()
	用途：	当前显示域的的域ID
	输入：  
	返回：  */
inline int	GetFieldColumnId(int FieldIndex)
	{
		if (FieldIndex>=0 && FieldIndex<m_CurShowFieldNum && m_ShowFieidInfo)
		{
			return m_ShowFieidInfo[FieldIndex].ColumnId;
		}else
		{
			return -1;
		}
	};

/*	函数：	GetCurColumnLength()
	用途：	获取当前域的数据长度
	输入：  
	返回：  */
inline short GetCurColumnLength(int columnNo)
{
	if (columnNo>=0 && columnNo<m_CurColumnNum && m_pColumnInfo)
	{
		return m_pColumnInfo[columnNo].clmDataLength;
	}else
	{
		return -1;
	}
};

/*	函数：	GetCurColumnEngName()
用途：	获取当前域的数据长度
输入：  
返回：  */
inline QString GetCurColumnEngName(int columnNo)
{
	if (columnNo>=0 && columnNo<m_CurColumnNum && m_pColumnInfo)
	{
		return QString::fromLocal8Bit(m_pColumnInfo[columnNo].ColumnEngName);
	}else
	{
		return "";
	}
};

/*	函数：	GetFieldColumnNo()
	用途：	当前显示域的的域序号
	输入：  
	返回：  */
inline int	GetFieldColumnNo(int FieldIndex)
{
	if (FieldIndex>=0 && FieldIndex<m_CurShowFieldNum && m_ShowFieidInfo)
	{
		return m_ShowFieidInfo[FieldIndex].ColumnNo;
	}else
	{
		return -1;
	}
};

/*	函数：	GetCurTableId()
	用途：	获取当前表AppType
	输入：  
	返回：  */
	inline int GetCurAppType(){return m_CurAppType;};

/*	函数：	GetCurTableId()
	用途：	获取当前表ID
	输入：  
	返回：  */
	inline int GetCurTableId(){return m_CurTableId;};

/*	函数：	GetCurTableId()
	用途：	获取当前表ID
	输入：  
	返回：  */
	inline int GetCurParentId(){return m_CurParentId;};

/*	函数：	GetModifyFlag()
	用途：	判断数据更新标志
	输入：  
	返回：  */
	bool	GetModifyFlag(){return m_bModigyFlag;};

/*	函数：	GetSibRecord()
	用途：	获取相关记录行号
	输入：  
	返回：  */
	int	GetSibRecord(int CurRowNo, int &sibRowNo, int CurEditFieldNo);

/*	函数：	GetSibRecord()
	用途：	获取相关记录行号
	输入：  
	返回：  */
	int	GetRelatedFieldNo(int CurEditFieldNo, int &RelatedFieldNo);

	//获取编码字符串
	int	GetNewCodeStr(int RowNo, int NewIndexNo, QString &NewCodeStr);
/*	函数：	IsNewDataUnSaved()
	用途：	是否有新数据未保存
	输入：  
	返回：  */
	bool	IsNewDataUnSaved();

/*	函数：	IsRelateColumnEnableEdit()
	用途：	是否关联字段可编辑
	输入：  
	返回：  */
	bool	IsRelateColumnEnableEdit(int RowNo, int FieldNo);

/*	函数：	SaveDeviceToModel()
	用途：	保存当前设备为模板设备
	输入：  
	返回：  */
	int	SaveDeviceToModel(int RowNo);

	/*	函数：	CheckUpDateColumnIsSafe
	用途:   检查修改字段是否合理
	输入：  
	返回：  */
//	bool	CheckUpDateColumnIsSafe(int RowNo, int FieldNo, char *NewDataBuff);

/*	函数：	IsCurRecordSetDeleteFlag
	用途:   判断当前记录是否有删除标志
	输入：  
	返回：  */
	bool  IsCurRecordSetDeleteFlag(int RowNo);

/*	函数：	IsCurRecordNewInsertFlag
	用途:   判断当前记录是否有新加记录标志
	输入：  
	返回：  */
	bool  IsCurRecordNewInsertFlag(int RowNo);
protected:
/*	函数：	InitTableData()
	用途：	初始化表数据
	输入：  
	返回：  */
	int	InitColumnInfo(int AppType, int TableId);

/*	函数：	InitShowFieldInfo()
	用途：	初始化显示字段的域信息
	输入：  
	返回：  */
	int	InitShowFieldInfo();

/*	函数：	GetFieldColumnNo()
	用途：	当前表显示域个数
	输入：  
	返回：  */

inline int	GetFieldDataOffset(int FieldIndex)
{
	if (FieldIndex>=0 && FieldIndex<m_CurShowFieldNum && m_ShowFieidInfo)
	{
		return m_ShowFieidInfo[FieldIndex].DataOffset;
	}else
	{
		return 0;
	}
};

/*	函数：	SetModifyFlag()
	用途：	设置数据更新标志
	输入：  
	返回：  */
inline void SetModifyFlag(bool bModified){ m_bModigyFlag = bModified;};

/*	函数：	InsertNewRecord()
	用途：	添加一条新记录
	输入：  
	返回：  */
	int	InsertNewRecord(RecordInfo *pRecord);

/*	函数：	DeleteOneRecord()
	用途：	删除一条新记录
	输入：  
	返回：  */
	int	DeleteOneRecord(RecordInfo *pRecord);

/*	函数：	UpDateOneRecord()
	用途：	修改一条新记录
	输入：  
	返回：  */
	int	UpDateOneRecord(RecordInfo *pRecord);

/*	函数：	CheckDataIsSaft()
	用途：	修改或添加操作前，先检查记录是否安全
	输入：  
	返回：  */
//	bool	CheckDataIsSaft(RecordInfo *pRecord);

/*	函数：	CheckDataIsSaft()
	用途：	修改或添加操作前，先检查记录是否安全
	输入：  
	返回：  */
	bool	IsRecordEnableDelete(RecordInfo *pRecord);

private:
/*	函数：	GetColuDataOffset()
	用途：	获取当前域的数据偏移
	输入：  
	返回：  */
	inline int	GetColumnDataOffset(int ColuNo);

/*	函数：	GetColuDataOffset()
	用途：	获取当前域的数据偏移
	输入：  
	返回：  */
    inline int	GetColumnNoFromId(unsigned int ColumnId);

/*	函数：	GetCurRecordIdfromBuff()
	用途：	从当前记录的缓冲区中读取记录ID（用于delete Update）
	输入：  
	返回：  */
	int	GetCurRecordIdfromBuff(RecordInfo *pRecord, unsigned int &RecordId);

/*	函数：	DeleteDeviceChild(unsigned int RecordID)
	用途:   删除设备
	输入：  RecordID ：设备表的记录ID
			AppType  : 表的类型
	返回：  */
	int	DeleteDeviceChild(int AppType, unsigned int RecordId);

	/*	函数：	DeleteLogicDeviceChild(unsigned int RecordID)
	用途:   删除逻辑设备
	输入：  RecordID ：设备表的记录ID
			AppType  : 表的类型
	返回：  */
	void DeleteLogicDeviceChild(int AppType, unsigned int RecordId);

	void DeleteLogicNodeChild(int AppType, unsigned int RecordId);

	/*	函数：	((unsigned int RecordID)
	用途:   删除任务
	输入：  RecordID ：设备表的记录ID
			AppType  : 表的类型
	返回：  */
	int DeleteTask(int AppType, unsigned int RecordId);

	/*	函数：	((unsigned int RecordID)
	用途:   删除任务
	输入：  RecordID ：设备表的记录ID
	AppType  : 表的类型
	返回：  */
	int DeleteExp(int AppType, unsigned int RecordId);

/*	函数：	Del61850Model(unsigned int RecordID)
	用途:   删除设备
	输入：  RecordID ：模板表的记录ID
	AppType  : 表的类型
	TableId  : 表的ID
	返回：  */
	int Del61850Model(int AppType, int TableId,unsigned int RecordID);

/*	函数：	ClearRelateYx()
	用途:   清空遥信关联
	输入：	unsigned int DeviceId
	返回：  */
	int	ClearRelateYx(unsigned int DeviceId);

/*	函数：	ClearRelateYc()
	用途:   清空遥测关联
	输入：	unsigned int DeviceId
	返回：  */
	int	ClearRelateYc(unsigned int DeviceId);

/*	函数：	ClearRelateYk()
	用途:   清空遥控关联
	输入：	unsigned int DeviceId
	返回：  */
	int	ClearRelateYk(unsigned int DeviceId);

/*	函数：	CheckAndClearYxRelate()
	用途:   检查并清空遥信记录的关联配置
	输入：	unsigned int YxRecordId
	返回：  */
	void	CheckAndClearYxRelate(unsigned int YxRecordId);

/*	函数：	CheckAndClearYcRelate()
	用途:   检查并清空遥测记录的关联配置
	输入：	unsigned int YcRecordId
	返回：  */
	void	CheckAndClearYcRelate(unsigned int YcRecordId);

/*	函数：	CheckAndClearYkRelate()
	用途:   检查并清空遥控记录的关联配置
	输入：	unsigned int YkRecordId
	返回：  */	
	void	CheckAndClearYkRelate(unsigned int YkRecordId);

/*	函数：	ClearDeviceRelateDevice()
	用途:   清空设备记录的关联设备
	输入：	
	返回：  */	
	int	ClearDeviceRelateDevice(unsigned int DeviceId);

/*	函数：	ClearDeviceRelateYx()
	用途:   清空设备记录的关联遥信
	输入：	unsigned int DeviceId
	返回：  */
	int	ClearDeviceRelateYx(unsigned int YxId);

/*	函数：	ClearYxRelateYx()
	用途:   清空遥信记录的关联遥信
	输入：	unsigned int DeviceId
	返回：  */
	int	ClearYxRelateYx(unsigned int YxId);

/*	函数：	ClearYxRelateYk()
	用途:   清空遥信记录的关联遥控
	输入：	unsigned int DeviceId
	返回：  */
	int	ClearYxRelateYk(unsigned int YkId);

/*	函数：	ClearYcRelateYx()
	用途:   清空遥测记录的关联遥信
	输入：	unsigned int DeviceId
	返回：  */
	int	ClearYcRelateYx(unsigned int YxId);

/*	函数：	ClearYkRelateYx()
	用途:   清空遥控记录的关联遥信
	输入：	unsigned int DeviceId
	返回：  */
	int	ClearYkRelateYx(unsigned int YxId);
	
	//检查当前修改是否合理
	bool	CheckUpDateRecordDataIsOk(RecordInfo *pRecord);
	//删除全景对象之下属子记录
	int	DeleteChild_GORecord(unsigned int AppType, unsigned int TableId, unsigned int ParentId);

private:

	DBText				m_DbTextObj;

	int				*m_pColBuffOffset;						//域数据偏移
	FieldInfo_Show		*m_ShowFieidInfo;						//显示域信息
	int				m_CurShowFieldNum;						//当前显示域个数
	int				m_RecordNum;							//记录个数
	int				m_CurColumnNum;							//当前域个数
	int				m_CurAppType;							//当前应用类型
	int				m_CurTableId;							//当前表
	int				m_CurParentId;							//当前表的父表
	int				m_CurRecordId;
	int				m_PtlParamtype;
	int             m_Fun_TotalShow_YX;						//总表显示遥信FUN
	int				m_RecordLength;							//单个记录长度
	cTable_Info			m_CurTableInfo;							//当前表的表信息	
	QList<RecordInfo>	m_RecordList;							//记录LIST
	MenuInfo			m_MenuInfo;
	bool				m_bModigyFlag;							//数据改动标志
	
	int					m_PageNum;								//分页数
	int					m_CurPageNo;							//当前页码
	int					m_SeltRecordNo;

};

#endif // MYTABLEDATA_H
